package cn.edu.seu.ssny.service;

import cn.edu.seu.ssny.entity.DeviceDataStd;
import cn.edu.seu.ssny.enums.TimeMode;

import java.util.Date;
import java.util.List;

/**
 * 根据需求，进行具体数据的查询
 */
public interface IQueryDataService {

    /**
     * 功能描述:
     * <查询deviceIds所指定的所有采集点最近一条数据的总和
     *
     * @param deviceIds
     * @return
     */
    Double getSumOfRecentOneDataOfDevices(List<Integer> deviceIds);

    /**
     * 功能描述:
     * <查询deviceIds所指定的所有采集点的时段数据之和
     * <example:
     * <deviceIds = [1,2,3]
     * <dates = [20210707000000,20210708000000,...,20210711000000,20210711080909]
     * <timeMode = TimeMode.MODE_DAY
     * <就会返回[1,2,3]采集点在20210707000000,20210708000000,..,20210711000000的时段数据其前后两天零点数据相减(最后一条数据是当前时刻的值与当天0点时刻数值相减)
     * <返回的数据列表长度应该等于输入的时间列表长度减一
     *
     * @param deviceIds
     * @param dates
     * @param timeMode
     * @return
     */
    List<Double> getPeroidSumofDevicesByDateList(List<Integer> deviceIds, List<Date> dates, int timeMode);

    /**
     * 功能描述:
     * <返回startDate和endDate之间,所有满足timeMode模式的数据和最近的一条数据，并且按照时间ASC
     * <example:
     * <deviceIds = [1,2,3]
     * <startDate = 20210707000000
     * <endDate = 20210722074900
     * <timeMode = TimeMode.DAY_MODE
     * <返回deviceIds在20210707000000、20210708000000、..、20210722000000、最近采集时刻(距离20210722074900)
     *
     * @param deviceIds
     * @param startDate
     * @param endDate
     * @param timeMode
     * @return
     */
    List<DeviceDataStd> findAllByDeviceIdsInAndCreateTimeBetweenOrderByCreateTimeASC(List<Integer> deviceIds, Date startDate, Date endDate, int timeMode);

}
